💡 上课前先想一个再常见不过的场景:
这个中间人,就是 Python 程序(也可以是 Java、PHP)。Web 开发、数据分析、爬虫,第一步都是它。
👉 本章就讲一件事:怎么用 Python 跟 MySQL"对话"。
Python 怎么跟 MySQL 说话
一个统一标准:DB API
Python DB API 是 Python 访问数据库的统一标准。连 MySQL、连 Oracle、连 SQLite,套路几乎一样 —— 学会一种,其他都会。
插鼠标、插键盘、插 U 盘,插孔和用法都一样,只是里面是不同设备。
用 Python 连不同数据库也一样:代码套路统一,换数据库不用从头学。
装一个包:mysql-connector-python
Python 标准库不能直接连 MySQL,要装个第三方包。用 MySQL 官方维护的这个最省心:
# 在命令行(不是 Python 里)运行
pip install mysql-connector-python
装完,在 Python 里写 import mysql.connector 就能用了。
两个主角:Connection 和 Cursor
整章你只跟两个对象打交道,分工很清楚:
🔌Connection 连接
跟数据库的"那根网线"。
管:连进来、提交、关闭。
常用:cursor() / commit() / rollback() / close()
🖊️Cursor 游标
真正"干活的那支笔"。
管:执行 SQL、取结果。
常用:execute() / fetchone() / fetchall()
connect,执行 SQL 和取结果都靠 cursor。5 步流程:固定套路
导 → 连 → 游 → 执 → 关
第 2 步细看:connect() 的参数
连接时要告诉它"连到哪、用谁的账号",一共 5 个参数:
| 参数 | 含义 | 常见值 |
|---|---|---|
| host | 数据库服务器地址 | 'localhost' |
| user | 登录用户名 | 'root' |
| passwd | 登录密码 | '123456' |
| database | 要操作哪个库 | 'teaching' |
| port | 端口,可省略 | 3306 |
① 这个数据库必须先存在,连接才成功(新库要先在 MySQL 里 CREATE DATABASE)。
② 前 4 个是必填,port 可以不写(默认就是 3306)。
第一个完整例子:查一下数据库版本
把 5 步串起来,跑通"连上 → 查个东西 → 关掉"这条最短路径:
import mysql.connector # ① 导入
db = mysql.connector.connect( # ② 连接
host='localhost',
user='root',
passwd='123456',
database='teaching'
)
cursor = db.cursor() # ③ 开游标
cursor.execute("SELECT VERSION()") # ④ 执行 SQL
data = cursor.fetchone() # 取一行结果
print("数据库版本:", data)
cursor.close() # ⑤ 关闭
db.close()
数据库版本: ('8.0.23',)
fetchone() 拿回来的是一个元组:('8.0.23',)(带括号、末尾有逗号)。
想要里面的字符串本身,用 data[0] 取第一个就行。
增删改查(CRUD)
增 / 删 / 改:换汤不换药
INSERT、UPDATE、DELETE 三种"改数据"的代码结构完全一样 —— 都要 commit、都用 try-except 包起来,只有那句 SQL 不同。学会一个,三个全会。
以插入一名新学生为例,这就是"改数据"的标准长相:
cursor = db.cursor()
try:
cursor.execute("INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')")
db.commit() # ⭐ 改完必须提交!
print("插入成功")
except:
db.rollback() # 出错就撤销
print("插入失败")
把那句 SQL 换一下,就变成改和删 —— 其余一个字都不用动:
# 改:把林毅的专业改成计算机 "UPDATE s SET maj='计算机' WHERE sn='林毅'" # 删:删掉学号 s12 的学生 "DELETE FROM s WHERE sno='s12'"
执行后看 cursor.rowcount,它会告诉你这次影响了多少行。改/删时特别有用。
查:fetch 三件套
查询用 SELECT,但结果得用 fetch 取出来。看你要几行,挑一个用:
| 方法 | 取多少 | 拿回来是什么 |
|---|---|---|
| fetchone() | 一行 | 一个元组 ('s1','王彤',…) |
| fetchall() | 全部行 | 元组的列表 [(…),(…)] |
| fetchmany(n) | n 行 | 元组的列表(最多 n 个) |
查所有 20 岁及以上的学生,挨个打印:
cursor.execute("SELECT * FROM s WHERE age >= 20")
results = cursor.fetchall() # 全部取回,是个列表
for row in results: # 一行一行打印
print(row)
fetchone 给元组,fetchall 给列表;数据量大但只看前几条,用 fetchmany(n)。事务:commit 和 rollback
为什么"改完一定要 commit"?
execute() 改数据时,改动先放在缓冲区,并没有真的写进 MySQL。必须调用 db.commit(),改动才真正"落盘"。
① execute() = 在编辑器里打字(屏幕上看得见);
② commit() = 点那个"保存"按钮(才真的存进硬盘)。
不点保存就关掉,刚打的字全没了 —— 不 commit,也是一样白干。
SELECT 只是看,不用提交;INSERT/UPDATE/DELETE 改了数据,必须 commit 才算数。rollback 和 try-except:给操作上保险
db.rollback() 的作用是撤销:把还没 commit 的改动全部退回,就当没发生过。配合 try-except,就成了改数据的"黄金套路":
try: cursor.execute(sql1) # 执行 SQL(可以多条) cursor.execute(sql2) db.commit() # 全部成功 → 一起提交 except: db.rollback() # 任何一条失败 → 全部撤销
批量插入时,万一中间一条出错,前面成功的也会被一起撤销 —— 要么全成功,要么全失败,不会留下"改了一半"的烂摊子。这就是第 9 章学过的事务原子性,在 Python 里的样子。
一张图看懂:读 和 写 的区别
写数据
要 commit,要 try-except
读数据
不用 commit,直接取结果
| 对比项 | 写数据(增/改/删) | 读数据(查) |
|---|---|---|
| 用的 SQL | INSERT / UPDATE / DELETE | SELECT |
| 要 commit 吗 | ✅ 必须 | ❌ 不用 |
| 要 try-except 吗 | ✅ 要(保安全) | ❌ 不必 |
| 怎么拿结果 | 看 rowcount(改了几行) | 用 fetch 取数据 |
- Python 连 MySQL 永远是 5 步:导 → 连 → 游 → 执 → 关,靠
mysql.connector这个包。 - 改数据(增/改/删)必须 commit,并套上 try-except + rollback 保证安全。
- 查数据用 fetch(一行 fetchone、全部 fetchall),不用 commit。
🎓 到这一章,整门课就讲完了
回头看看,这一学期你其实已经走完了一条完整的路 —— 从"认识数据库"到"亲手用数据库":
这些连起来,就是一套"既会造、又会用"的真本事。无论你之后做 Web、做数据、还是做后端,它们都还会一次次派上用场。下一步想继续走,可以看看 Redis、MongoDB,或者 Flask / Django。👇 先去把这一章上机练一遍。